///////////////////////////////////////////////////////////////////
//                            _ooOoo_                            //
//                           o8888888o                           //
//                           88" . "88                           //
//                           (| -_- |)                           //
//                            O\ = /O                            //
//                        ____/`---'\____                        //
//                      .   ' \\| |// `.                         //
//                       / \\||| : |||// \                       //
//                     / _||||| -:- |||||- \                     //
//                       | | \\\ - /// | |                       //
//                     | \_| ''\---/'' | |                       //
//                      \ .-\__ `-` ___/-. /                     //
//                   ___`. .' /--.--\ `. . __                    //
//                ."" '< `.___\_<|>_/___.' >'"".                 //
//               | | : `- \`.;`\ _ /`;.`/ - ` : | |              //
//                 \ \ `-. \_ __\ /__ _/ .-` / /                 //
//         ======`-.____`-.___\_____/___.-`____.-'======         //
//                            `=---='                            //
//                                                               //
//         .............................................         //
//                  佛祖保佑             永无BUG                  //
//                  需求不变             永不修改                 //
///////////////////////////////////////////////////////////////////
package com.longyue.ms.common.interceptors;

import com.alibaba.fastjson.JSON;

import com.longyue.ms.common.anotation.FormToken;
import com.longyue.ms.common.bean.ConstantBean;
import com.longyue.ms.common.util.SessionUtils;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.lang.reflect.Method;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
* @author: WenWenLi
* @description: 防止表单重复提交的拦截器
* @date: 2018/1/20
* @Version: 1.0
**/
public class FormDataInterceptors extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (handler instanceof HandlerMethod) {
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            Method method = handlerMethod.getMethod();
            FormToken annotation = method.getAnnotation(FormToken.class);
            if (annotation != null) {
                if (repeatDataValidator(request)) {
                    response.setCharacterEncoding("UTF-8");
                    response.setContentType("application/json; charset=utf-8");
                    PrintWriter out = null;
                    try {
                        out = response.getWriter();
                        //或者设置status 500 .利用ajajx 的 error方法
                        out.append(JSON.toJSONString(Collections.singletonMap(ConstantBean.FORM_SUBMIT_REPEAT_INFO_KEY, ConstantBean.FORM_SUBMIT_REPEAT_INFO_VALUE)));
                    } catch (Exception e) {
                        e.printStackTrace();
                    } finally {
                        if (out != null) {
                            out.close();
                        }
                    }
                    return false;
                } else {
                    return true;
                }
            }
            return true;

        } else {
            return super.preHandle(request, response, handler);
        }
    }

    /**
     * 验证同一个url数据是否相同提交  ,相同返回true
     *
     * @param httpServletRequest
     * @return
     */
    public boolean repeatDataValidator(HttpServletRequest httpServletRequest) {
        String params = JSON.toJSONString(httpServletRequest.getParameterMap());
        String url = httpServletRequest.getRequestURI();
        Map<String, String> map = new HashMap<String, String>();
        map.put(url, params);
        String nowUrlParams = map.toString();//
        Object preUrlParams = SessionUtils.getValueByKey("repeatData");
        if (preUrlParams == null) {//如果上一个数据为null,表示还没有访问页面
            SessionUtils.setValue("repeatData", nowUrlParams);
            return false;
        } else {//否则，已经访问过页面
            if (preUrlParams.toString().equals(nowUrlParams)) {//如果上次url+数据和本次url+数据相同，则是重复提交
                return true;
            } else {//如果上次 url+数据 和本次url加数据不同，则不是重复提交
                SessionUtils.setValue("repeatData", nowUrlParams);
                return false;
            }
        }
    }
}
